home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / demos / 275 / pascal / fastread.inc < prev    next >
Text File  |  1988-06-25  |  32KB  |  870 lines

  1.  
  2. {*************************************************************}
  3. {*               Eric's FASTREAD Routines                    *}
  4. {*                                                           *}
  5. {*   Written by:                                             *}
  6. {*      Eric W. Wedaa                                        *}
  7. {*      4620 East 17th Street                                *}
  8. {*      Tucson AZ, 85711                                     *}
  9. {*                                                           *}
  10. {*   Copyrighted 1987 by Eric W. Wedaa                       *}
  11. {*                                                           *}
  12. {*      BIX: EWEDAA                                          *}
  13. {*      CIS: 76515,2274                                      *}
  14. {*                                                           *}
  15. {*   Release Date: August 27, 1987.                          *}
  16. {*                                                           *}
  17. {*                                                           *}
  18. {*   Release Date: June 20, 1987.                            *}
  19. {*   Second Release Date: Feb. 21, 1988                      *}
  20. {*   Third Release date: June 25, 1988.                      *}
  21. {*                                                           *}
  22. {*   Don't let it be said I don't support my users.          *}
  23. {*************************************************************}
  24. {*                                                           *}
  25. {*   Written for OSS Pascal Version 1.14                     *}
  26. {*               GEM/TOS in ROM Version 1.00                 *}
  27. {*                                                           *}
  28. {*       Released in the Public Domain!                      *}
  29. {*                                                           *}
  30. {*************************************************************}
  31. {*                                                           *}
  32. {*   Design Tools included:                                  *}
  33. {*        Eric's Pascal Utilities,                           *}
  34. {*        Eric's Pascal Editor,                              *}
  35. {*        1st Word ver 1.03, by GST,                         *}
  36. {*        Alt, By Michtron,                                  *}
  37. {*        OSS Pascal, By O.S.S. and C.C.D.                   *}
  38. {*   and, Eric's Library Disk for OSS Pascal.                *}
  39. {*                                                           *}
  40. {*************************************************************}
  41.  
  42.  
  43. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  44. {++    The following files are needed to use these routines ++}
  45. {++       --Fastread.inc                                    ++}
  46. {++       --Fastread.con                                    ++}
  47. {++       --Fastread.typ                                    ++}
  48. {++       --Fastread.doc                                    ++}
  49. {++       --Read.Me                                         ++}
  50. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  51.  
  52. {Copyright 1987 by Eric W. Wedaa}
  53.  
  54. {Don't forget to include the FASTREAD constants and types.    }
  55.  
  56.  
  57. {1111111111111111111111111111111111111111111111111111111111111}
  58. {1111  Gemdos File Create Command.    111111111111111111111111}
  59. {1111111111111111111111111111111111111111111111111111111111111}
  60.  
  61. FUNCTION F_Create (VAR
  62.      A_File_Name : Path_Chars ; {  File name in "C" format.   }
  63.      Mode : INTEGER) {             Mode to open the file.     }
  64.  : INTEGER ; {                     Error Number.               }
  65.  
  66. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  67.  
  68. {    For this application, mode is always set to 0 for writing}
  69. { the file only.                                              }
  70.  
  71. GEMDOS ($3C) ;
  72.  
  73. {1111111111111111111111111111111111111111111111111111111111111}
  74. {1111  Gemdos File Open Command.    11111111111111111111111111}
  75. {1111111111111111111111111111111111111111111111111111111111111}
  76.  
  77. FUNCTION F_Open (VAR
  78.      A_File_Name : Path_Chars ; {  File name in "C" format.   }
  79.      Mode : INTEGER) {             Mode to open the file.     }
  80.  : INTEGER ; {                     Error Number.              }
  81.  
  82. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  83.  
  84. {    For this application, mode is always set to 0 for reading}
  85. { the file only.                                              }
  86.  
  87. GEMDOS ($3D) ;
  88.  
  89. {1111111111111111111111111111111111111111111111111111111111111}
  90. {1111   Gemdos File Close Command.    111111111111111111111111}
  91. {1111111111111111111111111111111111111111111111111111111111111}
  92.  
  93. FUNCTION File_Close (HANDLE : INTEGER) {File handle.          }
  94. : INTEGER ; {                        Error Number.            }
  95.  
  96. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  97.  
  98. GEMDOS ($3E) ;
  99.  
  100. {1111111111111111111111111111111111111111111111111111111111111}
  101. {1111   Gemdos File Read Command.    1111111111111111111111111}
  102. {1111111111111111111111111111111111111111111111111111111111111}
  103.  
  104. FUNCTION F_Read (HANDLE : INTEGER ; {File Handle.             }
  105.      Count : LONG_INTEGER ; {        Bytes to be read in.     }
  106.      VAR
  107.         Buf : Contents) {            Where to store the file. }
  108.     : LONG_INTEGER ;
  109.  
  110. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  111.  
  112. GEMDOS ($3F) ;
  113.  
  114. {1111111111111111111111111111111111111111111111111111111111111}
  115. {1111   Gemdos File Write Command.     11111111111111111111111}
  116. {1111111111111111111111111111111111111111111111111111111111111}
  117.  
  118. FUNCTION Fast_Write (HANDLE : INTEGER ; {File Handle.            }
  119.      Count : LONG_INTEGER ; {        Bytes to be read in.     }
  120.      VAR
  121.         Buf : Contents) {            Where to store the file. }
  122.     : LONG_INTEGER ;
  123.  
  124. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  125.  
  126. GEMDOS ($40) ;
  127.  
  128. {1111111111111111111111111111111111111111111111111111111111111}
  129. {1111   Loads the buffer after reset and readln.  111111111111}
  130. {1111111111111111111111111111111111111111111111111111111111111}
  131.  
  132. PROCEDURE F_Read_File (VAR
  133.      Txt_Buffer : Buffer) ;
  134.  
  135. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  136.  
  137.  BEGIN ;
  138.    Txt_Buffer.Buffer_Len :=  F_Read (Txt_Buffer.File_Handle, 
  139.         Contents_Size, Txt_Buffer.Buffer_Contents) ;
  140.    Txt_Buffer.Buffer_Contents[ Contents_Size + 1 ] :=  CHR (1) ;
  141.    IF Txt_Buffer.Buffer_Len >=  0 
  142.      THEN 
  143.       BEGIN ; { No error occured.}
  144.         Txt_Buffer.Eof_Buffer :=  FALSE ;
  145.         Txt_Buffer.Buffer_Pos :=  1 ;
  146.         Txt_Buffer.No_Error :=  TRUE ;
  147.         IF Txt_Buffer.Buffer_Len = Contents_Size 
  148.           THEN Txt_Buffer.Last_Buffer :=  FALSE 
  149.           ELSE 
  150.              BEGIN ; { Less than full buffer was loaded. }
  151.                 Txt_Buffer.Last_Buffer :=  TRUE ;
  152.                 IF Txt_Buffer.Buffer_Len = 0 
  153.                   THEN Txt_Buffer.Eof_Buffer :=  TRUE ;
  154.              END ;
  155.  
  156. {was         Txt_Buffer.Pos_In_File :=  Txt_Buffer.End_Pos + 1 ;}
  157. {changed to try and fix read past sof error}
  158.  
  159.         Txt_Buffer.Pos_In_File :=  Txt_Buffer.End_Pos  ;
  160.         Txt_Buffer.End_Pos :=  Txt_Buffer.End_Pos + Txt_Buffer.Buffer_Len ;
  161.       END{ Of No error occured.}
  162.  
  163.      ELSE 
  164.         BEGIN ; {error occured.}
  165.            Txt_Buffer.Buffer_Pos :=  1 ;
  166.            Txt_Buffer.Error_Number :=  INT (Txt_Buffer.Buffer_Len) ;
  167.            Txt_Buffer.No_Error :=  FALSE ;
  168.            Txt_Buffer.Buffer_Len :=  0 ;
  169.            Txt_Buffer.Last_Buffer :=  TRUE ;
  170.            Txt_Buffer.Eof_Buffer :=  TRUE ;
  171.         END ; {of error occured.  }
  172.  END ; {of procedure f_read_file. }
  173.  
  174. {1111111111111111111111111111111111111111111111111111111111111}
  175. {1111  Gemdos File Seek Command.    11111111111111111111111111}
  176. {1111111111111111111111111111111111111111111111111111111111111}
  177.  
  178. FUNCTION C_Seek ( POS : LONG_INTEGER ;
  179.      HANDLE, Mode : INTEGER) 
  180.  : LONG_INTEGER ; {                     Error Number.               }
  181.  
  182. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  183.  
  184. {    For this application, mode is always set to 0 for writing}
  185. { the file only.                                              }
  186.  
  187. GEMDOS ($42) ;
  188.  
  189.  
  190. {1111111111111111111111111111111111111111111111111111111111111}
  191. {1111  Resets the file position quickly, and/or reads in 11111}
  192. {1111  another buffer full.                              11111}
  193. {1111111111111111111111111111111111111111111111111111111111111}
  194.  
  195. FUNCTION F_Rseek (VAR
  196.      A_Buffer : Buffer ;
  197.      POS : LONG_INTEGER) : BOOLEAN ;
  198. VAR
  199.    Good : LONG_INTEGER ;
  200.  BEGIN ;
  201.    IF (A_Buffer.Pos_In_File >=  POS) 
  202.        AND (A_Buffer.End_Pos <=  POS) 
  203.      THEN 
  204.       BEGIN ;
  205.         F_Rseek :=  TRUE ;
  206.         A_Buffer.Buffer_Pos :=  POS - A_Buffer.Pos_In_File ;
  207.       END
  208.  
  209.      ELSE 
  210.         BEGIN ; {we have to really get it from the disk.}
  211.            Good :=  C_Seek ( POS, A_Buffer.File_Handle, 0) ;
  212.            IF Good < 0 
  213.              THEN 
  214.               BEGIN ; {It's an error!  }
  215.                 Good :=  C_Seek ( A_Buffer.End_Pos + 1, A_Buffer.File_Handle, 0) ;
  216.                 A_Buffer.Pos_In_File :=  POS ;
  217.                 A_Buffer.End_Pos :=  POS + A_Buffer.Buffer_Len ;
  218.                 F_Rseek :=  FALSE ;
  219.               END
  220.  
  221.              ELSE 
  222.                 BEGIN ; {It's a valid seek.}
  223.                    F_Read_File (A_Buffer) ;
  224.                    A_Buffer.Pos_In_File :=  POS ;
  225.                    A_Buffer.End_Pos :=  POS + A_Buffer.Buffer_Len ;
  226.                    F_Rseek :=  TRUE ;
  227.                 END ;
  228.         END ;
  229.  END ; {of function f_rseek.}
  230.  
  231. {1111111111111111111111111111111111111111111111111111111111111}
  232. {1111  writes and sets up the file here.   1111111111111111111}
  233. {1111111111111111111111111111111111111111111111111111111111111}
  234.  
  235. PROCEDURE F_Write_File (VAR
  236.      A_Buffer : Buffer) ;
  237. VAR
  238.    Bytes_Written : LONG_INTEGER ;
  239.  
  240.  BEGIN ;
  241.    WITH A_Buffer DO
  242.       BEGIN ;
  243.          Bytes_Written :=  Fast_Write (File_Handle, Buffer_Len, Buffer_Contents) ;
  244.          IF (Bytes_Written < 0) or  (Bytes_Written <> Buffer_Len )
  245.            THEN 
  246.             BEGIN ; {Error occured. }
  247.               No_Error :=  FALSE ;
  248.               Error_Number := (-10 ) ;
  249.               Buffer_Pos :=  1 ;
  250.               Buffer_Len :=  0 ;
  251.             END{Of error occurred. }
  252.            ELSE 
  253.               BEGIN ; {No error. }
  254.                  No_Error :=  TRUE ;
  255.                  Error_Number :=  0 ;
  256.                  Buffer_Pos :=  1 ;
  257.                  Buffer_Len :=  0 ;
  258.               END ; {Of no error. }
  259.  
  260.  
  261.       END ; {Of with A_Buffer do Begin. }
  262.  END ; {Of procedure F_Write_File. }
  263.  
  264. {1111111111111111111111111111111111111111111111111111111111111}
  265. {1111  Close the file here.   11111111111111111111111111111111}
  266. {1111111111111111111111111111111111111111111111111111111111111}
  267.  
  268. PROCEDURE F_Close (VAR
  269.      Txt_Buffer : Buffer) ;
  270.  
  271. {     This routine is allowed to be called by the programmer. }
  272.  
  273.  BEGIN ;
  274.    WITH Txt_Buffer DO
  275.       BEGIN ;
  276.          IF Reading_File 
  277.            THEN 
  278.             BEGIN ;
  279.               Buffer_Pos :=  1 ;
  280.               Buffer_Len :=  0 ;
  281.               Last_Buffer :=  TRUE ;
  282.               Eof_Buffer :=  TRUE ;
  283.               Error_Number :=  File_Close (File_Handle) ;
  284.               IF (Error_Number < 0) 
  285.                 THEN No_Error :=  FALSE 
  286.                 ELSE No_Error :=  TRUE ;
  287.             END
  288.  
  289.            ELSE 
  290.               BEGIN ; {We're writing to this file. }
  291.                  Buffer_Pos :=  Fast_Write (File_Handle, Buffer_Len, Buffer_Contents) ;
  292.                  IF Buffer_Pos <>  Buffer_Len 
  293.                    THEN 
  294.                     BEGIN ; {Errror occured}
  295.                       Error_Number :=  File_Close (File_Handle) ;
  296.                       Error_Number :=  INT (Buffer_Pos) ;
  297.                       No_Error :=  FALSE ;
  298.                     END
  299.  
  300.                    ELSE 
  301.                       BEGIN ;
  302.                          Last_Buffer :=  TRUE ;
  303.                          Eof_Buffer :=  TRUE ;
  304.                          Error_Number :=  File_Close (File_Handle) ;
  305.                          IF (Error_Number < 0) 
  306.                            THEN No_Error :=  FALSE 
  307.                            ELSE No_Error :=  TRUE ;
  308.                       END ;
  309.               END ;
  310.       END ; {of with txt_Buffer do. }
  311.  END ; {of procedure F_Close);}
  312.  
  313.  
  314. {1111111111111111111111111111111111111111111111111111111111111}
  315. {1111  Checks for the End Of File.  11111111111111111111111111}
  316. {1111111111111111111111111111111111111111111111111111111111111}
  317.  
  318. FUNCTION F_Eof (VAR
  319.      Txt_Buffer : Buffer) 
  320.  : BOOLEAN ;
  321.  
  322. {Returns True if EOF has been reached/else returns false. }
  323.  
  324.  
  325. {     This routine is allowed to be called by the programmer  }
  326.  
  327.  BEGIN ;
  328.    IF Txt_Buffer.Eof_Buffer 
  329.      THEN F_Eof :=  TRUE 
  330.      ELSE F_Eof :=  FALSE ;
  331.  END ; {Of function F_EOF.}
  332.  
  333. {1111111111111111111111111111111111111111111111111111111111111}
  334. {1111  Checks for the Start Of File.  111111111111111111111111}
  335. {1111111111111111111111111111111111111111111111111111111111111}
  336.  
  337. FUNCTION F_Sof (VAR
  338.      Txt_Buffer : Buffer) 
  339.  : BOOLEAN ;
  340.  
  341. {Returns True if EOF has been reached/else returns false. }
  342.  
  343.  
  344. {     This routine is allowed to be called by the programmer  }
  345.  
  346.  BEGIN ;
  347.    IF Txt_Buffer.Sof_Buffer 
  348.      THEN F_Sof :=  TRUE 
  349.      ELSE F_Sof :=  FALSE ;
  350.  END ; {Of function F_SOF.}
  351.  
  352.  
  353. {1111111111111111111111111111111111111111111111111111111111111}
  354. {1111  Checks to see if an error has occured.   11111111111111}
  355. {1111111111111111111111111111111111111111111111111111111111111}
  356.  
  357. FUNCTION F_Error (VAR
  358.      Txt_Buffer : Buffer) 
  359.  : BOOLEAN ;
  360.  
  361. {     This routine is allowed to be called by the programmer. }
  362. {    Returns True if error occured, else returns false.       }
  363.  
  364.  BEGIN ;
  365.    IF Txt_Buffer.No_Error 
  366.      THEN F_Error :=  FALSE 
  367.      ELSE F_Error :=  TRUE ;
  368.  END ; {Of function F_Error.}
  369.  
  370.  
  371. {1111111111111111111111111111111111111111111111111111111111111}
  372. {1111  Returns the error number if an error has occurred.  111}
  373. {1111111111111111111111111111111111111111111111111111111111111}
  374.  
  375. FUNCTION F_Io_Result (VAR
  376.      Txt_Buffer : Buffer) 
  377.  : INTEGER ; { Error number returned here.                       }
  378.  
  379. {     This routine is allowed to be called by the programmer. }
  380.  
  381.  BEGIN ;
  382.    IF NOT Txt_Buffer.No_Error 
  383.      THEN F_Io_Result :=  Txt_Buffer.Error_Number 
  384.      ELSE F_Io_Result :=  0 ;
  385.  END ; {Of function F_error_number.}
  386.  
  387.  
  388. {1111111111111111111111111111111111111111111111111111111111111}
  389. {11111  Converts A_File_Name to Fast Read format.  11111111111}
  390. {1111111111111111111111111111111111111111111111111111111111111}
  391.  
  392. PROCEDURE Make_Path (VAR
  393.      A_File_Name : STRING ;
  394.      VAR
  395.         F_File_Name : Path_Chars) ;
  396. VAR
  397.    X, Len : INTEGER ;
  398.  BEGIN ;
  399.    Len :=  LENGTH (A_File_Name) ;
  400.    FOR X :=  1 TO Len DO
  401.       F_File_Name[ X ] :=  A_File_Name[ X ] ;
  402.    F_File_Name[ Len + 1 ] :=  CHR (0) ;
  403.  END ;
  404.  
  405.  
  406. {1111111111111111111111111111111111111111111111111111111111111}
  407. {11111  Resets the file for reading.  111111111111111111111111}
  408. {1111111111111111111111111111111111111111111111111111111111111}
  409.  
  410. PROCEDURE F_Reset (VAR
  411.      Txt_Buffer : Buffer ;
  412.      A_File_Name : STRING ) ; {file name to be opened.        }
  413.  
  414. {     This routine is allowed to be called by the programmer. }
  415.  
  416. VAR
  417. {    Used to convert file_name to C format.                   }
  418.    F_File_Name : Path_Chars ;
  419.  
  420.  BEGIN ;
  421.  
  422. {  Convert to "C" format. }
  423.    Make_Path (A_File_Name, F_File_Name) ;
  424.  
  425. {Set constants.}
  426.    Txt_Buffer.Fast_Return :=  CHR (13) ;
  427.    Txt_Buffer.Fast_Line_Feed :=  CHR (10) ;
  428.  
  429.  
  430. { Open it.}
  431.    Txt_Buffer.File_Handle :=  F_Open (F_File_Name, 0) ; {file name, mode of}
  432. {read.}
  433.    IF Txt_Buffer.File_Handle >=  0 
  434.      THEN 
  435.       BEGIN ;
  436.         F_Read_File (Txt_Buffer) ; {load the buffer.}
  437.         Txt_Buffer.Pos_In_File :=  Txt_Buffer.Buffer_Pos-1 ;
  438.         Txt_Buffer.End_Pos :=  Txt_Buffer.Buffer_Len ;
  439.         Txt_Buffer.Reading_File :=  TRUE ;
  440.         Txt_Buffer.Sof_buffer :=  TRUE ;
  441.       END
  442.  
  443.      ELSE 
  444.         BEGIN ; {error occured in opening it.}
  445.            WITH Txt_Buffer DO
  446.               BEGIN ;
  447.                  Buffer_Pos :=  1 ;
  448.                  Buffer_Len :=  0 ;
  449.                  Last_Buffer :=  TRUE ;
  450.                  Eof_Buffer :=  TRUE ;
  451.                  Sof_Buffer := TRUE ;
  452.                  Error_Number :=  HANDLE ;
  453.                  No_Error :=  FALSE 
  454.               END ; {of with txt_Buffer do. }
  455.         END ; {of error occured in opening it. }
  456.  END ; {of procedure F_Reset. }
  457.  
  458.  
  459. {1111111111111111111111111111111111111111111111111111111111111}
  460. {11111  Sets up the file for writing.  11111111111111111111111}
  461. {1111111111111111111111111111111111111111111111111111111111111}
  462.  
  463. PROCEDURE F_Rewrite (VAR
  464.      Txt_Buffer : Buffer ;
  465.      A_File_Name : STRING ) ; {file name to be opened.        }
  466.  
  467. {     This routine is allowed to be called by the programmer. }
  468.  
  469. VAR
  470. {    Used to convert file_name to C format.                   }
  471.    F_File_Name : Path_Chars ;
  472.  
  473.  BEGIN ;
  474.  
  475. {  Convert to "C" format. }
  476.    Make_Path (A_File_Name, F_File_Name) ;
  477.  
  478. {Set constants.}
  479.    Txt_Buffer.Fast_Return :=  CHR (13) ;
  480.    Txt_Buffer.Fast_Line_Feed :=  CHR (10) ;
  481.  
  482.  
  483. { Open it.}
  484.    Txt_Buffer.File_Handle :=  F_Create (F_File_Name, 0) ; {file name, mode of}
  485. {   if txt_buffer.file_Handle>=0}
  486. { then Txt_Buffer.File_Handle :=  F_Open (F_File_Name, 1) ;}{file name, mode of}
  487. {read.}
  488.    IF Txt_Buffer.File_Handle >=  0 
  489.      THEN 
  490.       BEGIN ;
  491.         WITH Txt_Buffer DO
  492.            BEGIN ;
  493.               Buffer_Pos :=  1 ;
  494.               Buffer_Len :=  0 ;
  495.               Last_Buffer :=  FALSE ;
  496.               Eof_Buffer :=  FALSE ;
  497.               Error_Number :=  0 ;
  498.               No_Error :=  TRUE ;
  499.               Reading_File :=  FALSE ;
  500.            END ; {of with txt_Buffer do. }
  501.       END
  502.  
  503.      ELSE 
  504.         BEGIN ; {error occured in opening it.}
  505.            WITH Txt_Buffer DO
  506.               BEGIN ;
  507.                  Buffer_Pos :=  1 ;
  508.                  Buffer_Len :=  0 ;
  509.                  Last_Buffer :=  TRUE ;
  510.                  Eof_Buffer :=  TRUE ;
  511.                  Error_Number :=  HANDLE ;
  512.                  No_Error :=  FALSE 
  513.               END ; {of with txt_Buffer do. }
  514.         END ; {of error occured in opening it. }
  515.  END ; {of procedure F_Rewrite. }
  516.  
  517. {1111111111111111111111111111111111111111111111111111111111111}
  518. {1111111111111111111111111111111111111111111111111111111111111}
  519. {1111111111111111111111111111111111111111111111111111111111111}
  520.  
  521. PROCEDURE F_Readln (VAR
  522.      A_Buffer : Buffer ;
  523.      VAR
  524.         Txt_Line : Max_String) ; {Text line returned.   }
  525.  
  526. {     This routine is allowed to be called by the programmer. }
  527.  
  528. VAR
  529.    Counter : INTEGER ; {the length of the line returned. }
  530.  
  531. {2222222222222222222222222222222222222222222222222222222222222}
  532. {2222222222222222222222222222222222222222222222222222222222222}
  533. {2222222222222222222222222222222222222222222222222222222222222}
  534.  
  535.    PROCEDURE F_Read_It ;
  536.  
  537. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!        }
  538.  
  539.     BEGIN ;
  540.       WITH A_Buffer DO
  541.          BEGIN ;
  542.             IF (NOT Eof_Buffer) 
  543.               THEN 
  544.                BEGIN ; {           Load the string.                }
  545.                  WHILE (Buffer_Contents[ INT (Buffer_Pos) ] <>  Fast_Return) 
  546.                    AND (Counter < String_Size) 
  547.                    AND (Buffer_Pos <=  Buffer_Len ) DO
  548.                     BEGIN ;
  549.                        Counter :=  Counter + 1 ;
  550.                        Txt_Line[ Counter ] :=  Buffer_Contents[ INT (Buffer_Pos) ] ;
  551.                        Buffer_Pos :=  Buffer_Pos + 1 ;
  552.                     END ;
  553.  
  554.                  IF (Buffer_Pos <=  Buffer_Len) 
  555.                      AND (Buffer_Contents[ INT (Buffer_Pos) ] = Fast_Return ) 
  556.                    THEN 
  557.                     BEGIN ; {   Normal end of line hit.          }
  558.                       Txt_Line[ 0 ] :=  CHR (Counter) ;
  559.                       Buffer_Pos :=  Buffer_Pos + 2 ;
  560.                       IF (Buffer_Pos > Buffer_Len) 
  561.                           AND (NOT Last_Buffer) 
  562.                         THEN 
  563.                          BEGIN ; {Load the buffer again. }
  564.                            F_Read_File (A_Buffer) ;
  565.                            IF Buffer_Contents [ 1 ] = Fast_Line_Feed 
  566.                              THEN Buffer_Pos :=  2 
  567.                              ELSE Buffer_Pos :=  1 ;
  568.                          END ; {of load the buffer again.}
  569.                     END{of buffer_pos = chr(12). }
  570.  
  571. {                  Is the string full?                            }
  572.                    ELSE IF (Counter >=  String_Size) 
  573.                      THEN Txt_Line[ 0 ] :=  CHR (Counter) 
  574.  
  575.                      ELSE IF (Buffer_Pos > Buffer_Len) 
  576.                          AND (NOT Last_Buffer) 
  577.                        THEN 
  578.                         BEGIN ; {Have to load and read again. }
  579. {                         Load it here. }
  580.                           F_Read_File (A_Buffer) ; {load the buffer.}
  581. {                         Finish reading the line here.}
  582.                           IF No_Error 
  583.                             THEN F_Read_It 
  584.                             ELSE Txt_Line[ 0 ] :=  CHR (Counter) ;
  585.                         END{ of have to load it again.}
  586.  
  587. {         Did we hit the last char in the file?             }
  588.                        ELSE IF (Buffer_Pos > Buffer_Len) 
  589.                            AND ( Last_Buffer) 
  590.                          THEN 
  591.                           BEGIN ; {set length to counter and eof to true. }
  592.                             Txt_Line[ 0 ] :=  CHR (Counter) ;
  593.                             Eof_Buffer :=  TRUE ;
  594.                           END ;
  595.                  IF (Buffer_Pos > Buffer_Len) 
  596.                      AND ( Last_Buffer) 
  597.                    THEN 
  598.                     BEGIN ; {set length to counter and eof to true. }
  599.                       Eof_Buffer :=  TRUE ;
  600.                     END ;
  601.  
  602.  
  603.                END ; {of not eof buffer.}
  604.          END ; {of with buffer do begin. }
  605.     END ; {of f_Read_it. }
  606.  
  607. {------------------------------------------------------------------}
  608.  BEGIN ;
  609.    Txt_Line[ 0 ] :=  CHR (0) ;
  610.    Counter :=  0 ;
  611.    F_Read_It ;
  612.    A_Buffer.Sof_Buffer :=  FALSE ;
  613.  END ; {of f_readln. }
  614.  
  615. {1111111111111111111111111111111111111111111111111111111111111}
  616. {1111111111111111111111111111111111111111111111111111111111111}
  617. {1111111111111111111111111111111111111111111111111111111111111}
  618.  
  619. PROCEDURE F_Breadln (VAR
  620.      A_Buffer : Buffer ;
  621.      VAR
  622.         Txt_Line : Max_String) ; {Text line returned.   }
  623.  
  624. {     This routine is allowed to be called by the programmer. }
  625. {    This routine reads the file backwards from whereever you just}
  626. { read from.  Please check for a while not SOF(Buffer) while using it.}
  627.  
  628. VAR
  629.    First : INTEGER ; {Have we seen the first "Fast Return yet?}
  630.    Temp : BOOLEAN ; {To hold value of a_buffer.sof for readln}
  631.    debug:boolean;
  632.  
  633. {2222222222222222222222222222222222222222222222222222222222222}
  634. {2222222222222222222222222222222222222222222222222222222222222}
  635. {2222222222222222222222222222222222222222222222222222222222222}
  636.  
  637.    PROCEDURE F_Bread_It ;
  638.    VAR
  639.       X : BOOLEAN ;
  640.  
  641. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!        }
  642.     BEGIN ;
  643.  
  644. if false then begin;
  645. writeln('Entering F_Bread_It***********************************');
  646. writeln('bufpos',a_buffer.buffer_pos,
  647.  
  648. ' buf ln ',a_buffer.buffer_len,
  649. ' pos in file ',a_buffer.pos_in_file,
  650. ' eof ',a_buffer.eof_buffer,
  651. ' sof ',a_buffer.sof_buffer);
  652. writeln('///////////////////////////////////////////////////');
  653. end;
  654.       WITH A_Buffer DO
  655.          BEGIN ;
  656.             IF (NOT Sof_Buffer) 
  657.               THEN 
  658.                BEGIN ; {Go backwards}
  659.                  Buffer_Pos :=  Buffer_Pos - 3 ;
  660.                  IF Buffer_Pos < 1 
  661.                    THEN IF Pos_In_File > 0 
  662.                      THEN 
  663.                       BEGIN ; {call seek}
  664.                         Buffer_Pos :=  Buffer_Pos + 3 ;
  665.                         X :=  F_Rseek ( A_Buffer, Buffer_Pos - Contents_Size) ;
  666.                         Buffer_Pos :=  Buffer_Len ;
  667. { Pos_In_File :=  Pos_In_File - 1 ;}
  668.                         F_Bread_It ;
  669.                       END
  670.  
  671.                      ELSE Sof_Buffer :=  TRUE ;
  672.                  WHILE (Buffer_Pos >=  1 ) 
  673.                    AND (First <>  2) DO
  674.                     BEGIN ;
  675.                        IF (Buffer_Contents[ INT (Buffer_Pos) ] = Fast_Return) 
  676.                          THEN First :=  First + 1 ;
  677.                        Buffer_Pos :=  Buffer_Pos - 1 ;
  678.                     END ;
  679.  
  680.                  IF (Buffer_Pos > 1 ) 
  681.                      AND (First = 2) 
  682.                    THEN 
  683.                     BEGIN ;
  684.                       Buffer_Pos :=  Buffer_Pos + 3 ;
  685.                     END
  686.  
  687. {Did we hit the start of the file? }
  688.                    ELSE IF (Buffer_Pos < 1 ) 
  689.                        AND (Pos_In_File = 0) 
  690.                      THEN 
  691.                       BEGIN ; {set Sof to true. }
  692.                         Sof_Buffer :=  TRUE ;
  693. buffer_pos:=1;
  694.                       END
  695.  
  696.                      ELSE 
  697.                         BEGIN ; {call seek}
  698.                            X :=  F_Rseek ( A_Buffer, Pos_In_File - Contents_Size) ;
  699.                            Buffer_Pos :=  Buffer_Len ;
  700.                            F_Bread_It ;
  701.                         END ;
  702.                END ;
  703.          END ; {of with buffer do begin. }
  704.     END ; {of f_Read_it. }
  705.  
  706. {------------------------------------------------------------------}
  707.  BEGIN ;
  708.    First :=  0 ;
  709.    F_Bread_It ;
  710.    Temp :=  A_Buffer.Sof_Buffer ;
  711.    F_Readln (A_Buffer, Txt_Line) ;
  712.    A_Buffer.Sof_Buffer :=  Temp ;
  713.  END ; {of f_breadln. }
  714.  
  715. {1111111111111111111111111111111111111111111111111111111111111}
  716. {1111111111111111111111111111111111111111111111111111111111111}
  717. {1111111111111111111111111111111111111111111111111111111111111}
  718.  
  719. PROCEDURE F_Writeln (VAR
  720.      A_Buffer : Buffer ;
  721.      VAR
  722.         Txt_Line : Max_String) ; {Text line returned.   }
  723.  
  724. {     This routine is allowed to be called by the programmer. }
  725.  
  726. VAR
  727.    String_Size, {       The size of the string.          }
  728.    Counter : INTEGER ; {the length of the line returned. }
  729.  
  730. {2222222222222222222222222222222222222222222222222222222222222}
  731. {2222222222222222222222222222222222222222222222222222222222222}
  732. {2222222222222222222222222222222222222222222222222222222222222}
  733.  
  734.    PROCEDURE F_Write_It ;
  735.  
  736. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!        }
  737.  
  738.     BEGIN ;
  739.       WITH A_Buffer DO
  740.          BEGIN ;
  741.             WHILE (Counter < String_Size) 
  742.               AND (Buffer_Pos <=  Contents_Size ) DO
  743.                BEGIN ;
  744.                   Counter :=  Counter + 1 ;
  745.                   Buffer_Contents[ INT (Buffer_Pos) ] :=  Txt_Line[ Counter ] ;
  746.                   Buffer_Pos :=  Buffer_Pos + 1 ;
  747.                END ;
  748.  
  749.             Buffer_Len :=  Buffer_Pos - 1 ;
  750.  
  751.             IF (Buffer_Pos <=  Contents_Size - 1) 
  752.               THEN 
  753.                BEGIN ; {   Normal end of line hit.          }
  754.                  Buffer_Contents[ INT (Buffer_Pos) ] :=  Fast_Return ;
  755.                  Buffer_Pos :=  Buffer_Pos + 1 ;
  756.                  Buffer_Contents[ INT (Buffer_Pos) ] :=  Fast_Line_Feed ;
  757.                  Buffer_Pos :=  Buffer_Pos + 1 ;
  758.                  Buffer_Len :=  Buffer_Len + 2 ;
  759.                  IF (Buffer_Len = Contents_Size) 
  760.                    THEN F_Write_File (A_Buffer) ;
  761.                END{of buffer_pos  <=  Contents_Size. }
  762.  
  763.               ELSE IF (Buffer_Pos > Contents_Size) 
  764.                 THEN 
  765.                  BEGIN ; {Have to write it and finsh the line. }
  766. {                         Write it here. }
  767.                    F_Write_File (A_Buffer) ; {load the buffer.}
  768. {                         Finish writing the line here.}
  769.                    IF No_Error 
  770.                      THEN F_Write_It ;
  771.                  END
  772.  
  773.                 ELSE 
  774.                    BEGIN ;
  775. {The end of the line occurs at the buffer boudary.}
  776.                       IF Buffer_Pos = Contents_Size 
  777.                         THEN 
  778.                          BEGIN ;
  779.                            Buffer_Contents[ INT (Buffer_Pos) ] :=  Fast_Return ;
  780.                            Buffer_Len :=  Buffer_Len + 1 ;
  781.                            F_Write_File (A_Buffer) ;
  782.                            Buffer_Contents[ INT (Buffer_Pos) ] :=  Fast_Line_Feed ;
  783.                            Buffer_Pos :=  Buffer_Pos + 1 ;
  784.                            Buffer_Len :=  Buffer_Len + 1 ;
  785.                          END
  786.  
  787.                         ELSE 
  788.                            BEGIN ; {Buffer_Pos > Contents_Size. }
  789.                               F_Write_File (A_Buffer) ;
  790.                               Buffer_Contents[ INT (Buffer_Pos) ] :=  Fast_Return ;
  791.                               Buffer_Pos :=  Buffer_Pos + 1 ;
  792.                               Buffer_Contents[ INT (Buffer_Pos) ] :=  Fast_Line_Feed ;
  793.                               Buffer_Pos :=  Buffer_Pos + 1 ;
  794.                               Buffer_Len :=  Buffer_Len + 2 ;
  795.                            END ;
  796.                    END ; {The end of the line occurs at the buffer boudary.}
  797.  
  798.          END ; {of with A_Buffer do begin. }
  799.     END ; {of F_Write_It. }
  800.  
  801. {------------------------------------------------------------------}
  802.  BEGIN ;
  803.    String_Size :=  LENGTH (Txt_Line) ;
  804.    Counter :=  0 ;
  805.    F_Write_It ;
  806.  END ; {of F_Writeln. }
  807.  
  808.  
  809. {1111111111111111111111111111111111111111111111111111111111111}
  810. {1111111111111111111111111111111111111111111111111111111111111}
  811. {1111111111111111111111111111111111111111111111111111111111111}
  812.  
  813. PROCEDURE F_Write (VAR
  814.      A_Buffer : Buffer ;
  815.      VAR
  816.         Txt_Line : Max_String) ; {Text line returned.   }
  817.  
  818. {     This routine is allowed to be called by the programmer. }
  819.  
  820. VAR
  821.    String_Size, {       The size of the string.          }
  822.    Counter : INTEGER ; {the length of the line returned. }
  823.  
  824. {2222222222222222222222222222222222222222222222222222222222222}
  825. {2222222222222222222222222222222222222222222222222222222222222}
  826. {2222222222222222222222222222222222222222222222222222222222222}
  827.  
  828.    PROCEDURE F_Write_2it ;
  829.  
  830. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!        }
  831.  
  832.     BEGIN ;
  833.       WITH A_Buffer DO
  834.          BEGIN ;
  835.             WHILE (Counter < String_Size) 
  836.               AND (Buffer_Pos <=  Contents_Size ) DO
  837.                BEGIN ;
  838.                   Counter :=  Counter + 1 ;
  839.                   Buffer_Contents[ INT (Buffer_Pos) ] :=  Txt_Line[ Counter ] ;
  840.                   Buffer_Pos :=  Buffer_Pos + 1 ;
  841.                END ;
  842.  
  843.             Buffer_Len :=  Buffer_Pos - 1 ;
  844.  
  845.             IF (Buffer_Pos <=  Contents_Size ) 
  846.               THEN 
  847.                BEGIN ; {   Normal end of line hit.          }
  848. {                   Don't do anything.}
  849.                END
  850.  
  851.               ELSE IF (Buffer_Pos > Contents_Size) 
  852.                 THEN 
  853.                  BEGIN ; {Have to write it and finsh the line. }
  854. {                         Write it here. }
  855.                    F_Write_File (A_Buffer) ; {load the buffer.}
  856. {                         Finish writing the line here.}
  857.                    IF No_Error 
  858.                      THEN F_Write_2it ;
  859.                  END ;
  860.  
  861.          END ; {of with A_Buffer do begin. }
  862.     END ; {of F_Write_It. }
  863.  
  864. {------------------------------------------------------------------}
  865.  BEGIN ;
  866.    String_Size :=  LENGTH (Txt_Line) ;
  867.    Counter :=  0 ;
  868.    F_Write_2it ;
  869.  END ; {of F_Write. }
  870.